package question2;

import java.awt.BorderLayout;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class IHMListe extends JPanel implements ActionListener,ItemListener{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JPanel          cmd = new JPanel();
	private JLabel          afficheur = new JLabel();
	private JTextField      saisie = new JTextField();

	private JPanel          panelBoutons = new JPanel();
	private JButton         boutonRechercher = new JButton("rechercher");
	private JButton         boutonRetirer = new JButton("retirer");

	private CheckboxGroup  mode = new CheckboxGroup();
	private Checkbox       ordreCroissant = new Checkbox("croissant", mode, false);
	private Checkbox       ordreDecroissant = new Checkbox("decroissant", mode, false);

	private JButton         boutonOccurrences = new JButton("occurrence");

	private JTextArea       texte = new JTextArea();
	private JScrollPane     textePane = new JScrollPane( texte );

	private List<String>   liste;
	private Map<String,Integer>   occurrences;


	public IHMListe(List<String> liste, Map<String,Integer> occurrences){
		this.liste = liste;
		this.occurrences = occurrences;

		cmd.setLayout(new GridLayout(3,1));

		cmd.add(afficheur);cmd.add(saisie);

		panelBoutons.setLayout(new FlowLayout(FlowLayout.LEFT));
		panelBoutons.add(boutonRechercher);panelBoutons.add(boutonRetirer);
		panelBoutons.add(new JLabel("tri du texte :"));
		panelBoutons.add(ordreCroissant);panelBoutons.add(ordreDecroissant);
		panelBoutons.add(boutonOccurrences);
		cmd.add(panelBoutons);

		afficheur.setText(liste.getClass().getName() + " et " + occurrences.getClass().getName());
		texte.setLineWrap( true );
		texte.setWrapStyleWord( true );
		texte.setText(liste.toString());

		setLayout(new BorderLayout());

		add(cmd,"North");
		add(textePane,"Center");

		boutonRechercher.addActionListener(this);
		boutonOccurrences.addActionListener(this);
		boutonRetirer.addActionListener(this);
		ordreCroissant.addItemListener(this);
		ordreDecroissant.addItemListener(this);
		// boutons a completer;

	}

	/** ne pas modifier les affichages, les classes de tests en ont besoin ... */
	public void actionPerformed(ActionEvent ae){
		try{
			boolean res=false;
			if (ae.getSource() == boutonRechercher || ae.getSource() == saisie){
				res = liste.contains(saisie.getText());
				@SuppressWarnings("unused")
				Integer occur = occurrences.get(saisie.getText());
				afficheur.setText("resultat de la recherche de : " + saisie.getText() + " -->  "+ res);
			} else if (ae.getSource() == boutonRetirer){
				res = retirerDeLaListeTousLesElementsCommencantPar(saisie.getText());
				afficheur.setText("resultat du retrait de tous les elements commencant par -->  " + saisie.getText() + " : " + res);
			} else if (ae.getSource() == boutonOccurrences){
				Integer occur = occurrences.get(saisie.getText());
				if(occur!=null)  
					afficheur.setText(" -->  " + occur + " occurrence(s)");
				else
					afficheur.setText(" -->  ??? ");
			}
			texte.setText(liste.toString());

		}catch(Exception e){
			afficheur.setText( e.toString());
		}
	}



	public void itemStateChanged(ItemEvent ie){
		if (ie.getSource() == ordreCroissant)
			Collections.sort(liste);// a completer
		else if (ie.getSource() == ordreDecroissant)
			Collections.sort(liste,new reverseOrder());// a completer
		texte.setText(liste.toString());
	}

	private class reverseOrder implements Comparator<String>{

		@Override
		public int compare(String s1, String s2) {
			// TODO Auto-generated method stub
			return -s1.compareTo(s2);
		}
		
	}

	private boolean retirerDeLaListeTousLesElementsCommencantPar(String prefixe){
		boolean resultat = false;
		Iterator<String> it = liste.iterator();
		while(it.hasNext()) {
			String key = it.next();
			if(key.startsWith(prefixe)) {
				it.remove();
				occurrences.put(key, 0);
				resultat = true;
			}
		}
		return resultat;
	}
}